# -*- coding: utf-8 -*-
# @File: backend => __init__.py.py
# @CreateTime: 2025/8/25 10:53
# @Author: EvanZhang
# @Info: 本软件包用于存放FastAPI的数据库模型

# 导入模型，在这里写就不用每次都在settings.py里写了
from .room_players import RoomPlayer
from .rooms import Room
from .users import User
from .hands import Hand
from .hand_players import HandPlayer
from .actions import Action
from .transactions import Transaction
from .chat_messages import ChatMessage


__all__ = [
    "Room",
    "RoomPlayer",
    "User",
    "Hand",
    "HandPlayer",
    "Action",
    "Transaction",
    "ChatMessage",
]

# 一、MySQL（持久化、关系型、可回滚）
# users
# id | username | pwd_hash | avatar | chips | created_at | updated_at
# rooms
# id | name | sb | bb | max_players | pwd_hash | status | created_at
# room_players（玩家与房间的绑定历史，用于战绩统计）
# id | room_id | user_id | seat_index | buy_in_chips | left_chips | created_at | left_at
# hands（每一局牌）
# id | room_id | board_cards | pot_size | finished_at
# hand_players（每局每个玩家的明细）
# id | hand_id | user_id | hole_cards | best_rank | win_amount | contributed_pot
# actions（行动日志，方便回放 & 审计）
# id | hand_id | user_id | action_type | amount | timestamp
# transactions（金币流水，充值、买入、赢钱、税收）
# id | user_id | delta | type | ref_hand_id | created_at
# chat_messages（全局/房间聊天记录）
# id | room_id | user_id | message | timestamp

# 二、Redis（只放“活数据”，TTL+内存，重启可丢）
# room:{room_id}:info（Hash）
# key: small_blind, big_blind, dealer_pos, current_hand_id, status …
# room:{room_id}:seats（List 或 Hash）
# seat_0: {user_id, chips_on_table, state, last_action}
# seat_1: …
# room:{room_id}:deck（List）
# 整副洗牌后的牌堆，发一张 pop 一张喵。
# room:{room_id}:board（List）
# 翻牌、转牌、河牌依次追加。
# room:{room_id}:pot（Hash）
# main_pot, side_pot_1, side_pot_2 …
# room:{room_id}:action（Hash）
# to_act_seat, last_bet, min_raise, action_deadline_ts
# user:{user_id}:socket（String）
# 当前 WebSocket 连接标识，断线重连用。
# user:{user_id}:lock（String，SET NX PX）
# 扣款、坐下时的分布式锁，过期 5 秒。
# online_users（Set）
# 全局在线用户 uid，方便统计。
# leaderboard:zset
# 实时金币排行榜，ZADD/ZINCRBY 即可。

# 三、同步策略喵
# 玩家坐下：Redis 原子扣款并写 seats → MySQL 延迟批量写 room_players。
# 每局结束：Redis 结算完立即把 hands、hand_players、actions、transactions 批量 INSERT 进 MySQL，然后清空 Redis 牌桌相关 key。
# 异常宕机：重启后根据 MySQL 的 room.status='playing' 找到未完结的 room_id，再按 MySQL 的 hand_players 与 actions 重建 Redis 现场即可继续牌局喵。